import fs from 'fs'
import path from 'path'
import axios from 'axios'

// 递归读取所有文件
function getFilesFromDir(dirPath) {
  const files = fs.readdirSync(dirPath)
  let fileList = []

  files.forEach((file) => {
    const fullPath = path.join(dirPath, file)
    const stats = fs.statSync(fullPath)

    // 如果是目录，则递归处理
    if (stats.isDirectory()) {
      fileList = fileList.concat(getFilesFromDir(fullPath))
    } else {
      // 处理文件
      fileList.push(fullPath)
    }
  })

  return fileList
}

export default function uploadFileListPlugin(options = {}) {
  const {
    outputFile = 'file-list.json', // 输出文件名
    uploadUrl = '', // 上传 URL（必填）
    distPath = 'dist', // 打包目录，默认为 dist
    toUpperCase = true, // 是否将文件名转大写
  } = options

  return {
    name: 'vite-plugin-upload-filelist',

    // 打包完成后触发
    async closeBundle() {
      const distDir = path.resolve(process.cwd(), distPath)

      // 检查打包目录是否存在
      if (!fs.existsSync(distDir)) {
        console.error(`[upload-filelist] 错误：找不到 dist 目录！`)
        return
      }

      try {
        // 递归读取 dist 目录下的所有文件（包括子目录）
        const files = getFilesFromDir(distDir)

        // 生成文件信息列表
        const fileList = files.map((filePath) => {
          const stats = fs.statSync(filePath)

          // 提取文件名
          const filename = path.relative(distDir, filePath)
          return {
            name: toUpperCase ? filename.toUpperCase() : filename,
            size: stats.size, // 文件大小（字节）
            modifiedTime: stats.mtime.toISOString(), // 文件修改时间（ISO 格式）
          }
        })

        // 生成 JSON 文件的路径
        const fileListPath = path.join(distDir, outputFile)

        // 写入文件清单到 JSON 文件
        fs.writeFileSync(
          fileListPath,
          JSON.stringify(
            { timestamp: new Date().toISOString(), files: fileList },
            null,
            2
          ),
          'utf-8'
        )
        console.log(`📃 文件清单已生成: ${fileListPath}`)

        // 如果指定了上传 URL，则上传文件清单
        if (uploadUrl) {
          try {
            const response = await axios.post(uploadUrl, { files: fileList })
            console.log(
              '📤 文件清单已上传:',
              response.status,
              response.statusText
            )
          } catch (err) {
            // 上传失败的错误处理
            console.error('❌ 上传文件清单失败:', err.message)
          }
        } else {
          console.warn('⚠️ 未配置 uploadUrl，跳过上传')
        }
      } catch (err) {
        // 捕获读取文件或上传过程中出现的错误
        console.error('❌ 执行过程中出现错误:', err.message)
      }
    },
  }
}
